package tp1;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Celda {
	
	int x;
	int y;
	Object contenido;
	boolean accesoEscritor;
	boolean accesoLector;
	int cantLectores;
	Lock lock = new ReentrantLock();
	Condition leer = lock.newCondition();
	Condition escribir = lock.newCondition();
	

	public boolean sePuedeEscribir(){
		
		return accesoEscritor && cantLectores == 0;
	}
	
	public boolean sePuedeLeer(){
		return accesoLector;
	}
	
	public void escribir() throws InterruptedException{
		lock.lock();
		
		while(!sePuedeEscribir()){
			escribir.await();
		}
		accesoLector = false;
		accesoEscritor = false;
		
		lock.unlock();
	}
	
	public void terminarDeEscribir(){
		
		lock.lock();
		
		accesoLector = true;
		accesoEscritor = true;
		
		escribir.signal();
		leer.signalAll();
		
		lock.unlock();
		}
	
	
	public Object leer()throws InterruptedException{
		
		lock.lock();
		
		while(!accesoLector || contenido == null){
			leer.await();
		}
		cantLectores++;
		accesoEscritor = false;
		
		lock.unlock();
		return contenido;
	}
	
	public void terminarDeLeer(){
		lock.lock();

		cantLectores--;
		if(cantLectores == 0){
			accesoEscritor = true;
			escribir.signal();
		}		
		lock.unlock();
	}
	
	public Celda(int xx, int yy){
		this.x = xx;
		this.y = yy;
		contenido = null;
		accesoLector = true;
		accesoEscritor = true;
		cantLectores = 0;
	}
	
	
}
